/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CONTROLES;

import INTERFAZ.InformacionCliente;
import INTERFAZ.PantallaPrincipal;
import INTERFAZ.RegistroCliente;
import INTERFAZ.RegistroDactilarFrame;
import MODELOS.Cliente;
import MODELOS.HuellaDigital;
import UTILITARIOS.Herramienta;
import com.griaule.grfingerjava.FingerprintImage;
import com.griaule.grfingerjava.GrFingerJava;
import com.griaule.grfingerjava.GrFingerJavaException;
import com.griaule.grfingerjava.IFingerEventListener;
import com.griaule.grfingerjava.IImageEventListener;
import com.griaule.grfingerjava.IStatusEventListener;
import com.griaule.grfingerjava.MatchingContext;
import com.griaule.grfingerjava.Template;
import java.awt.Toolkit;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/**
 *
 * @author Administrador
 */
public class HabilitarLector implements IStatusEventListener, IImageEventListener,IFingerEventListener {

     private MatchingContext huellaSDK = null;
     private boolean autoExtract = true;
     private ByteArrayInputStream huellasDatos;

    
     private PantallaPrincipal p;
   /**Arreglo que contiene la longitud del dato de la huella*/
   private int huellaLongitud;

   /** La imagen de la última huella digital capturada. */
   private FingerprintImage huellaDigital;

   /** La plantilla de la última imagen de huella capturada */
   public com.griaule.grfingerjava.Template template;

   
   public HabilitarLector(PantallaPrincipal p){
   this.p = p;
    inicializarCaptura();
   }

   

   
  

   private void inicializarCaptura() {


       try {
           GrFingerJava.initializeCapture(this);
          
           huellaSDK = new MatchingContext();
           //Inicializa la captura de huella digital.
            System.out.println("entro a inicializar");
       } catch (Exception e) {
           //Si ocurre un error durante la inicialización se indica con un mensaje y se cierra la aplicación.
           e.printStackTrace();
           System.exit(1);
       }
   }

   public void terminarCaptura() {
       try {
          
           GrFingerJava.finalizeCapture();
           huellaSDK.destroy();
           //Inicializa la captura de huella digital.
           
       } catch (Exception e) {
           //Si ocurre un error durante la inicialización se indica con un mensaje y se cierra la aplicación.
           e.printStackTrace();
           System.exit(1);
       }
   }

    

    public static void setFingerprintSDKNativeDirectory(String directorio) {
       File directory = new File(directorio);

       try {
           GrFingerJava.setNativeLibrariesDirectory(directory);
           GrFingerJava.setLicenseDirectory(directory);
       } catch (GrFingerJavaException e) {
           e.printStackTrace();
       }
   }

    public void onSensorPlug(String idSensor) {
        try {
           //Comienza la captura con el lector conectado.
           GrFingerJava.startCapture(idSensor, this, this);
       } catch (GrFingerJavaException e) {
           //Indica si ha ocurrido un error con el lector.
           e.printStackTrace();
       }
    }

    public void onSensorUnplug(String idSensor) {
        try {
           GrFingerJava.stopCapture(idSensor);
       } catch (GrFingerJavaException e) {
           //Indica si ha ocurrido un error con el lector.
           e.printStackTrace();
       }
    }

    public void onImageAcquired(String arg0, FingerprintImage huellaCapturada) {

        this.huellaDigital=huellaCapturada;

       //Muestra la imagen obtenida
        System.out.println("estado adquiriendo imagen :"+p);
        p.showImage(huellaDigital);
        System.out.println("en habilitar lector");
        extract();
        identificarPersona();
       
       
        

    }

     public void extract() {

       try {
           //Extrae el template de la imagen de la huellaDigital actual.
           template = huellaSDK.extract(huellaDigital);
           //muestra minutias, segmentos y direcciones de la huella
           
               p.showImage(GrFingerJava.getBiometricImage(template, huellaDigital));
               
           
           } catch (GrFingerJavaException e) {
               
           e.getCause();
       }

   }

    public void onFingerDown(String idSensor) {

    }

    public void onFingerUp(String arg0) {

    }

    public void identificarPersona() {
        
        Conexion conexion=new Conexion();

    try {
            Connection conectado = conexion.getConexion();
            PreparedStatement psU = conectado.prepareStatement("select * from huella");
            ResultSet resUltimo = psU.executeQuery();
            while(resUltimo.next()){

            byte templateBD[] = resUltimo.getBytes("huella_dac");
               //Crea una nueva plantilla
            System.out.println(templateBD);
               Template nuevoTemplate = new Template(templateBD);

               //compara las plantilas (actual vs bd)
              
               System.out.println("entrooo al coinciden de identificarrrrrrrrrrrr");
               boolean coinciden = huellaSDK.verify(template,nuevoTemplate);
               System.out.println("saliioooooooooooo");
               //Si encuentra correspondencia dibuja el mapa
               //e indica el nombre de la persona que coincidió.
               Toolkit.getDefaultToolkit().beep();
               if (coinciden){

                   Cliente em = new Cliente();
                   int id = resUltimo.getInt("id_cliente");
                   System.out.println("numero de id q esta pasando.... "+id);
                   ControlCliente cli = new ControlCliente();
                  
                   em = cli.dameCliente(id);

                   p.showImage(GrFingerJava.getBiometricImage(template, huellaDigital, huellaSDK));
                   
                   JOptionPane.showMessageDialog(p, "La huella es de "+em.getNombreCliente()+" "+em.getApellidosCli());
                   
                   p.cerrar();
                                     
                   InformacionCliente inf = new InformacionCliente(em);
                   Herramienta.centerOnScreen(inf);
                   inf.setVisible(true);
                 
                   return;
               }
                
            }
            //int res = JOptionPane.showConfirmDialog(p, "El Cliente no tiene registrada su huella, desea registrarlo?", "Información", JOptionPane.OK_CANCEL_OPTION);
            JOptionPane.showMessageDialog(p, "El cliente no se encuentra registrado,\n  cerrar la ventana y proceda al registro ", "Advertencia", JOptionPane.OK_OPTION);
            
            /*                if(res ==0){
                                RegistroCliente r = new RegistroCliente();
                                Herramienta.centerOnScreen(r);
                                p.cerrar();
                                
                                r.setVisible(true);
                   } */

                                    
        }
        catch (SQLException e) {
           e.printStackTrace();
       } catch (GrFingerJavaException e) {
           e.printStackTrace();
       }
    }


}
